#ifndef TDACORREO_H_
#define TDACORREO_H_

/* Este TDA representa un correo */
/* Salvo en la primitiva de creacion, se asume como PRE para todas las primitivas que el correo esta creado */
/* En todas las primitivas se asume en forma implicita que el primer parametro es una variable del tipo del TDA */

#include <stdio.h>
#include <time.h>
#include "TDAListaDestinatarios.h"

/* Tamano maximo de direcciones de mail */
#define MAX_ADDR_SIZE 50
/*Tamano maximo de destinatarios a cargar*/
#define MAX_ADDR_TODOS_LOS_DEST 510
/* Tamano maximo del asunto del correo */
#define MAX_SUBJECT_SIZE 150
/* Tamano maximo del cuerpo del correo */
#define MAX_BODY_SIZE 1024
/* Nombre del correo*/
#define NOMBRE_CORREO Correo_prueba.txt

#define MAX_QTY_DEST 10

#define DEST_NOT_FOUND 999

#define MAX_FILENAME 100

#define DEFAULT_MSG "MENSAJE DE PRUEBA"
#define DEFAULT_SUB "ASUNTO DE PRUEBA"
#define DEFAULT_RMT "remitente@ejemplo.com"
#define DEFAULT_DST "destinatario@ejemplo.com"

#define EMPTY_DATA ""



/* Definicion del tipo de dato */
typedef struct {

    char remitente[MAX_ADDR_SIZE];
    char filename[MAX_FILENAME];
    char destinatarios[MAX_QTY_DEST][MAX_ADDR_SIZE];
    char asunto[MAX_SUBJECT_SIZE];
    char cuerpo[MAX_BODY_SIZE];
    time_t fechaHora;
    int qtyDest;

} TDACorreo;

/*
 * Crea el correo
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: se ha creado el correo
 *
 */
void crearCorreo(TDACorreo* correo);




/*
 * Destruye el correo
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: N/A
 * POST: el correo se ha destruido
 *
 */
void destruirCorreo(TDACorreo* correo);





/*
 * Obtiene la direccion de correo del remitente del correo
 *
 * Parametros:
 * remitente	un char* que apunta a un buffer donde se copiara la direccion de correo del remitente
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: remitente apunta a una zona de memoria valida con espacio suficiente para contener MAX_ADDR_SIZE caracteres y ademas el caracter terminador de cadena
 * POST: se ha copiado en remitente la direccion de correo del remitente
 *
 */
void getRemitente(TDACorreo correo, char* remitente);

/*
 * Establece el valor del remitente del correo
 *
 * Parametros:
 * remitente	un char* que apunta a una cadena de texto con la direccion de correo del remitente
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: remitente apunta a una cadena de texto valida de no mas de MAX_ADDR_SIZE caracteres
 * POST: se ha establecido el valor del remitente de forma que sea el indicado
 *
 */
void setRemitente(TDACorreo* correo, char* remitente);

/*
 * Obtiene las direcciones de correo de los destinatarios del correo, separadas por comas si hay mas de una
 *
 * Parametros:
 * destinatarios	un char* que apunta a un buffer donde se copiara la direccion de correo del remitente
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: remitente apunta a una zona de memoria valida con espacio suficiente para contener, por cada destinatario, MAX_ADDR_SIZE caracteres y ademas el caracter terminador de cadena, y tambien las comas separadoras
 * POST: se han copiado en remitente las direcciones de correo de los destinatarios, separadas por comas si hay mas de una
 *
 */
void getDestinatarios(TDACorreo correo,TListaSimple* ListaDestinatarios);



/*
 * Consulta la cantidad de destinatarios del correo
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * un entero que indica la cantidad de destinatarios del correo
 *
 * PRE: N/A
 * POST: se ha devuelto un valor que indica la cantidad de destinatarios del correo
 *
 */
int getCantidadDestinatarios(TDACorreo correo);

/*
 * Establece el valor de un unico destinatario del correo
 * Esta primitiva se utiliza cuando el destinatario es uno solo, y al utilizarla se sobreescribe cualquier valor previo para el destinatario
 *
 * Parametros:
 * destinatario	un char* que apunta a una cadena de texto con la direccion de correo del destinatario
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: destinatario apunta a una cadena de texto valida de no mas de MAX_ADDR_SIZE caracteres
 * POST: se ha establecido el valor del destinatario de forma que sea el indicado
 *
 */
void setDestinatario(TDACorreo* correo, char* ListaDestinatarios);

/*
* Agrega un Destinatario a la lista de destinatarios existente en el TDACorreo
*
* Valor de retorno:
* N/A
*
* PRE: el correo debe estar creado
* POST: si el destinatario no existe en la lista de destinatarios del TDA correo este es aregado
*/
void agregarDestinatario(TDACorreo* correo,char* destinatario);



/*
* Elimina un Destinatario de la lista de destinatarios existente en el TDACorreo
*
* Valor de retorno:
* N/A
*
* PRE: el correo debe estar creado
* POST: si el destinatario existe en la lista de destinatarios del TDA correo este es eliminado
*/
void eliminarDestinatario(TDACorreo* correo,char* destinatario);

/*
 * Obtiene la fecha/hora en que se envio el correo
 *
 * Parametros:
 * N/A
 *
 * Valor de retorno:
 * un time_t que representa la fecha/hora en que se envio el correo
 * NOTA: las funciones que permiten trabajar con el tipo time_t estan definidas en time.h
 *
 * PRE: el correo ha sido enviado
 * POST: se ha devuelto la fecha/hora de envio del correo
 *
 */
time_t getFechaHoraEnviado(TDACorreo correo);

/*
 * Establece el valor de fecha/hora en que se ha enviado el correo
 *
 * Parametros:
 * fechaHora	un time_t que contiene la fecha/hora en que se ha enviado el correo
 * NOTA: las funciones que permiten trabajar con el tipo time_t estan definidas en time.h
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: fechaHora apunta a un time_t valido que indica la fecha/hora de envio del correo
 * POST: se ha establecido la fecha/hora de envio del correo
 *
 */
void setFechaHoraEnviado(TDACorreo* correo, time_t fechaHora);

/*
 * Obtiene el texto del asunto del correo
 *
 * Parametros:
 * asunto	un char* que apunta a un buffer donde se copiara el texto del asunto del correo
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: asunto apunta a una zona de memoria valida con espacio suficiente para contener MAX_SUBJECT_SIZE caracteres y ademas el caracter terminador de cadena
 * POST: se ha copiado en asunto el texto del asunto del mensaje
 *
 */
void getAsunto(TDACorreo correo, char* asunto);

/*
 * Establece el valor del texto del asunto del correo
 *
 * Parametros:
 * asunto	un char* que apunta a una cadena de texto con el texto del asunto del correo
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: asunto apunta a una cadena de texto valida de no mas de MAX_SUBJECT_SIZE caracteres
 * POST: se ha establecido el valor del texto del asunto de forma que sea el indicado
 *
 */
void setAsunto(TDACorreo* correo, char* asunto);

/*
 * Obtiene el texto del cuerpo del correo
 *
 * Parametros:
 * textoCuerpo	un char* que apunta a un buffer donde se copiara el texto del cuerpo del correo
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: textoCuerpo apunta a una zona de memoria valida con espacio suficiente para contener MAX_BODY_SIZE caracteres y ademas el caracter terminador de cadena
 * POST: se ha copiado en textoCuerpo el texto del cuerpo del mensaje
 *
 */
void getTextoCuerpo(TDACorreo correo, char* textoCuerpo);

/*
 * Establece el valor del texto del cuerpo del correo
 *
 * Parametros:
 * textoCuerpo	un char* que apunta a una cadena de texto con el texto del cuerpo del correo
 *
 * Valor de retorno:
 * N/A
 *
 * PRE: textoCuerpo apunta a una cadena de texto valida de no mas de MAX_BODY_SIZE caracteres
 * POST: se ha establecido el valor del texto del cuerpo del correo de forma que sea el indicado
 *
 */
void setTextoCuerpo(TDACorreo* correo, char* textoCuerpo);

/*
 * Establece los valores de los campos del correo segun el contenido del archivo indicado
 *
 * Parametros:
 * archivo	un FILE* que apunta a un archivo valido y cerrado
 *
 * Valor de retorno:
 * 0 si se pudo importar exitosamente desde el archivo
 * 1 si ocurrio un error al intentar importar desde el archivo
 *
 * PRE: archivo apunta a un archivo valido y cerrado (no ha sido abierto antes de llamar a esta primitiva)
 * POST: se han establecido los valores de los campos del correo indicados en el archivo y se ha cerrado nuevamente dicho archivo
 *
 */
int importarDesde(TDACorreo* correo, FILE* archivo);




/*
 * Guarda los valores de los campos del correo en el archivo indicado
 * Si el archivo ya existe, su contenido es reemplazado completamente al ejecutar esta primitiva
 *
 * Parametros:
 * archivo	un FILE* que apunta a un archivo no existente, o bien existente y cerrado
 *
 * Valor de retorno:
 * 0 si se pudo escribir exitosamente el archivo
 * 1 si ocurrio un error al intentar escribir el archivo
 *
 * PRE: archivo apunta a un archivo no existente, o bien existente y cerrado
 * POST: se han grabado los valores de los campos del correo en el archivo indicado y se ha cerrado el mismo
 *
 */
int escribirA(TDACorreo correo, FILE* archivo);


/* buscarDestinatario
 * Pre.: correo creado
 * Post.: Devuelve la posicion del destinatario en el correo si lo encontro, y de no encontrarlo
 * devuelve DEST_NOT_FOUND.
 */
int buscarDestinatario(TDACorreo* correo,char* destinatario);


/* getDestinatarioX
 * Pre.: correo creado
 * Post.: Devueve el destinatario que se encuentra en la posicion "posicion".
 *
 */
void getDestinatarioX(TDACorreo* correo,char* destinatario, int posicion);


/* getFileName
 * Pre.: correo creado
 * Post.: Devuelve el nombre del archivo a partir del cual se creo el correo.
 *
 */
void getFilename(TDACorreo correo, char* filename);


/* setFileName
 * Pre.: correo creado
 * Post.: Establece el nombre de filename del correo.
 *
 */
void setFilename(TDACorreo *correo, char* filename);


/* printCorreo
 * pre.: correo creado
 * post.: N/A
 *
 */
void printCorreo(TDACorreo correo);


#endif

